home *** CD-ROM | disk | FTP | other *** search
- BEGIN {
- pi = 4.0 * atan2(1, 1)
- CONVFMT = "%.10g"
- OFMT = "%.10g"
- tol = 0.00005
- verbose = 2
- }
- function abs(a) {
- return (a > 0 ? a : -a)
- }
- /^Ambient[ \t]+[Ll]ight[ \t]+[Cc]olor/ {
- r = substr($4, 5)
- g = substr($5, 7)
- b = substr($6, 6)
- print "ambient", r, g, b
- next
- }
- /^Background[ \t]+[Ss]olid[ \t]+[Cc]olor/ {
- r = substr($4, 5)
- g = substr($5, 7)
- b = substr($6, 6)
- print "background", r, g, b
- bg = 1
- next
- }
- /^Named[ \t]+[Oo]bject/ {
- if (ft != 0 && f != ft) {
- print "Error: too few triangles" >"/dev/stderr"
- ft = 0
- exit
- }
- if (ft != 0) {
- for (i = 0; i < ft; i++) {
- i1 = v1[i]
- if (y[i1] == "R") i1 = x[i1]
- i2 = v2[i]
- if (y[i2] == "R") i2 = x[i2]
- i3 = v3[i]
- if (y[i3] == "R") i3 = x[i3]
- if (i1 == i2 || i1 == i3 || i2 == i3) {
- fdg++
- continue
- }
- s = m[i]
- if (i in fs) {
- if (abs(nx[i1]) < tol && abs(ny[i1]) < tol && abs(nz[i1]) < tol) {
- fdg++
- continue
- }
- if (abs(nx[i2]) < tol && abs(ny[i2]) < tol && abs(nz[i2]) < tol) {
- fdg++
- continue
- }
- if (abs(nx[i3]) < tol && abs(ny[i3]) < tol && abs(nz[i3]) < tol) {
- fdg++
- continue
- }
- print "triangle normal", s, \
- x[i1], y[i1], z[i1], nx[i1], ny[i1], nz[i1], \
- x[i2], y[i2], z[i2], nx[i2], ny[i2], nz[i2], \
- x[i3], y[i3], z[i3], nx[i3], ny[i3], nz[i3]
- } else
- print "triangle", s, x[i1], y[i1], z[i1], \
- x[i2], y[i2], z[i2], x[i3], y[i3], z[i3]
- }
- for (i in x) delete x[i]
- for (i in y) delete y[i]
- for (i in z) delete z[i]
- for (i in nx) delete nx[i]
- for (i in ny) delete ny[i]
- for (i in nz) delete nz[i]
- for (i in v1) delete v1[i]
- for (i in v2) delete v2[i]
- for (i in v3) delete v3[i]
- for (i in fs) delete fs[i]
- for (i in m) delete m[i]
- }
- oname = $3
- for (i = 4; i <= NF; i++) oname = oname""$i
- otype = 0
- ft = 0
- print ";", oname
- if (verbose) printf "\n%s", oname >"/dev/stderr"
- next
- }
- /^Tri-mesh/ {
- if (otype != 0) {
- print "Error: bad object" >"/dev/stderr"
- exit
- }
- otype = 1
- v = 0
- f = 0
- vt = $3
- fast = 0
- if (vt > 500) fast = 1
- ft = $5
- if (verbose) print ":", vt, ft >"/dev/stderr"
- if (verbose > 1) {
- vcnt = int(vt / 65) + 1
- fcnt = int(ft / 65) + 1
- }
- next
- }
- /^Vertex[ \t]+[Ll]ist/ {
- if (verbose > 1) {
- printf "vertices: " >"/dev/stderr"
- cnt = 0
- }
- next
- }
- /^Vertex[ \t]+[0-9]+/ {
- if (otype != 1) {
- print "Error: bad vertex" >"/dev/stderr"
- exit
- }
- if (verbose > 1) {
- cnt++
- if (cnt % vcnt == 0) printf "." >"/dev/stderr"
- }
- if (!fast) {
- for (vr = 0; vr < v; vr++) {
- if (abs(x[vr] - $4) < tol && \
- abs(y[vr] - $6) < tol && \
- abs(z[vr] - $8) < tol) break
- }
- if (vr != v) {
- vdg++
- x[v] = vr
- y[v] = "R"
- z[v] = ""
- v++
- if (v > vt) {
- print "Error: too many vertices" >"/dev/stderr"
- exit
- }
- next
- }
- }
- x[v] = $4
- y[v] = $6
- z[v] = $8
- v++
- if (v > vt) {
- print "Error: too many vertices" >"/dev/stderr"
- exit
- }
- next
- }
- /^Face[ \t]+[Ll]ist/ {
- if (v != vt) {
- print "Error: too few vertices" >"/dev/stderr"
- exit
- }
- if (verbose > 1) {
- printf "\n faces: " >"/dev/stderr"
- cnt = 0
- }
- next
- }
- /^Face[ \t]+[0-9]+/ {
- if (verbose > 1) {
- cnt++
- if (cnt % fcnt == 0) printf "." >"/dev/stderr"
- }
- v1[f] = $4
- v2[f] = $6
- v3[f] = $8
- f++
- if (f > ft) {
- print "Error: too many triangles" >"/dev/stderr"
- ft = 0
- exit
- }
- next
- }
- /^Material/ {
- if (NF <= 1) s = "DEFAULT"
- if (NF > 1) s = $2
- for (i = 3; i <= NF; i++) s = s""$i
- if (!(s in mlist)) {
- mlist[s] = ""
- print "#define", s, "surface matte white data"
- }
- m[f - 1] = s
- next
- }
- /^Smoothing/ {
- fs[f - 1] = ""
- i1 = v1[f - 1]
- if (y[i1] == "R") i1 = x[i1]
- p1x = x[i1]
- p1y = y[i1]
- p1z = z[i1]
- i2 = v2[f - 1]
- if (y[i2] == "R") i2 = x[i2]
- p2x = x[i2] - p1x
- p2y = y[i2] - p1y
- p2z = z[i2] - p1z
- i3 = v3[f - 1]
- if (y[i3] == "R") i3 = x[i3]
- p3x = x[i3] - p1x
- p3y = y[i3] - p1y
- p3z = z[i3] - p1z
- p1x = p2y * p3z - p2z * p3y
- p1y = p2z * p3x - p2x * p3z
- p1z = p2x * p3y - p2y * p3x
- t = sqrt(p1x * p1x + p1y * p1y + p1z * p1z)
- if (t < tol) {
- f--
- ft--
- next
- }
- p1x /= t
- p1y /= t
- p1z /= t
- if (!(i1 in nx)) {
- nx[i1] = 0
- ny[i1] = 0
- nz[i1] = 0
- }
- nx[i1] += p1x
- ny[i1] += p1y
- nz[i1] += p1z
- if (!(i2 in nx)) {
- nx[i2] = 0
- ny[i2] = 0
- nz[i2] = 0
- }
- nx[i2] += p1x
- ny[i2] += p1y
- nz[i2] += p1z
- if (!(i3 in nx)) {
- nx[i3] = 0
- ny[i3] = 0
- nz[i3] = 0
- }
- nx[i3] += p1x
- ny[i3] += p1y
- nz[i3] += p1z
- next
- }
- /^Direct[ \t]+[Ll]ight/ {
- getline
- px = $3
- py = $5
- pz = $7
- ltype = 1
- getline
- while ($1 != "Light") {
- if ($1 == "Spotlight") {
- ltype = 2
- sx = $4 - px
- sy = $6 - py
- sz = $8 - pz
- }
- if ($1 == "Falloff") {
- f = $3
- }
- getline
- }
- r = substr($3, 5)
- g = substr($4, 7)
- b = substr($5, 6)
- if (ltype == 1) print "light point", px, py, pz, r, g, b
- if (ltype == 2) print "light spot", px, py, pz, sx, sy, sz, \
- r, g, b, f / 2, 2
- next
- }
- /^Camera/ {
- if (NF > 1) {
- i = 1
- fd = ""
- t = substr($2, 2, 1)
- while (t != "m") {
- fd = fd""t
- t = substr($2, 2 + i, 1)
- i++
- }
- printf "fov %.6g ;%.10g mm\n", atan2(46.0, fd) * 90 / pi, fd
- }
- getline
- px = $3
- py = $5
- pz = $7
- print "eye", px, py, pz
- getline
- px = $3
- py = $5
- pz = $7
- print "look", px, py, pz
- getline
- print "up 0 0 1"
- next
- }
- END {
- if (ft != 0 && f != ft) {
- print "Error: too few triangles" >"/dev/stderr"
- exit
- }
- if (ft != 0) {
- for (i = 0; i < ft; i++) {
- i1 = v1[i]
- if (y[i1] == "R") i1 = x[i1]
- i2 = v2[i]
- if (y[i2] == "R") i2 = x[i2]
- i3 = v3[i]
- if (y[i3] == "R") i3 = x[i3]
- if (i1 == i2 || i1 == i3 || i2 == i3) {
- fdg++
- continue
- }
- s = m[i]
- if (i in fs) {
- if (abs(nx[i1]) < tol && abs(ny[i1]) < tol && abs(nz[i1]) < tol) {
- fdg++
- continue
- }
- if (abs(nx[i2]) < tol && abs(ny[i2]) < tol && abs(nz[i2]) < tol) {
- fdg++
- continue
- }
- if (abs(nx[i3]) < tol && abs(ny[i3]) < tol && abs(nz[i3]) < tol) {
- fdg++
- continue
- }
- print "triangle normal", s, \
- x[i1], y[i1], z[i1], nx[i1], ny[i1], nz[i1], \
- x[i2], y[i2], z[i2], nx[i2], ny[i2], nz[i2], \
- x[i3], y[i3], z[i3], nx[i3], ny[i3], nz[i3]
- } else
- print "triangle", s, x[i1], y[i1], z[i1], \
- x[i2], y[i2], z[i2], x[i3], y[i3], z[i3]
- }
- }
- if (!bg) print "background black"
- if (verbose > 1) print "" >"/dev/stderr"
- if (vdg > 0) \
- print "Warning: bad vertices -", vdg >"/dev/stderr"
- if (fdg > 0) \
- print "Warning: bad triangles -", fdg >"/dev/stderr"
- }
-